Skip to content

fix(core): prevent re-entrant deadlock in SegmentDestination.cleanupUploads#444

Open
sean-fubotv wants to merge 1 commit into
segmentio:mainfrom
sean-fubotv:fix/segmentdestination_cleanupuploads
Open

fix(core): prevent re-entrant deadlock in SegmentDestination.cleanupUploads#444
sean-fubotv wants to merge 1 commit into
segmentio:mainfrom
sean-fubotv:fix/segmentdestination_cleanupuploads

Conversation

@sean-fubotv

Copy link
Copy Markdown

For issue: #443

• Bug: SegmentDestination.cleanupUploads() invoked each upload's cleanup closure and analytics?.log(...) inside the uploadsQueue.sync block. If any callee re-entered a queue accessor (pendingUploads, add(uploadTask:), or another cleanupUploads() — realistic given URLSession completion callbacks and logger plugins), the serial queue would trap with EXC_BAD_INSTRUCTION.

• Fix (Sources/Segment/Plugins/SegmentDestination.swift): collect cleanup closures under the lock, then run them after the lock is released.

• Tests (Tests/Segment-Tests/SegmentDestination_Tests.swift, new file, 4 tests, all passing): non-running removal + cleanup fires, running task retention, re-entrant cleanup safety, concurrent add+cleanup stress.

…ploads

Collect per-upload cleanup closures inside the uploadsQueue.sync block
and invoke them after the lock is released. Previously, cleanup and
analytics?.log ran while the serial queue was held, which could trap
with EXC_BAD_INSTRUCTION if any callee re-entered uploadsQueue.sync
(e.g. via pendingUploads, add(uploadTask:), or another cleanupUploads
call from a URLSession completion).

Adds SegmentDestination_Tests covering: non-running task removal,
running task retention, re-entrant cleanup safety, and concurrent
add/cleanup access.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant